/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 * 
 * Este asistente permite agregar nuevos lotes dentro de los lotes existentes en la base de datos
 * Actualmente ya se como editar
 * Actualmente permite seleccionar el Departamento, el Distrito y cargar los datos de:
 * Nombre
 * Compania
 * Superficie
 * Unidad de medida Superficie
 * 
 * 
 */
package org.knolle.lotes.gui;

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.marcelo.agro.entidades.*;
import org.marcelo.agro.core.ComboEnBackground;
import org.marcelo.agro.core.api.ILotes;
import org.openide.util.Lookup;


/**
 * 
 * @author marcelo
 * Ahora voy a cambiar la logica de esta parte en el constructo voy a pasarle los valores 
 * de los campos para en el panel los text y los combos queden seteados a los valores iniciales
 * en la vista no hay referencias a los objetos POJO
 * El controller se encarga de validar los datos y setearlos al objeto Pojo,
 * Hay dos constructores el constructor para un objeto nuevo, y el constructor para la edicion de objetos
 * 
 * 
 */
public final class LotesVisualPanel1 extends JPanel  implements DocumentListener{

    /**
     * Creates new form LotesVisualPanel1
     */
    public static final String PROPIEDAD_DEPARTAMENTO = "departamento";
    public static final String PROPIEDAD_DISTRITO = "distrito";
    public static final String PROPIEDAD_NOMBRE = "nombre";
    public static final String PROPIEDAD_COMPANIA = "compania";
    public static final String PROPIEDAD_ES_PROPIO = "esPropio";
    public static final String PROPIEDAD_SUPERFICIE = "superficie";
    public static final String PROPIEDAD_UNIDAD_MEDIDA = "unidadMedida";
    public static final String PROPIEDAD_COMENTARIOS = "comentarios";
    
    
//    private final Lotes actual;
    private ILotes il = Lookup.getDefault().lookup(ILotes.class); 
    
    public LotesVisualPanel1() {
        initComponents();
//        actual = new modelo.Lotes();
        setListener();
        cargarComboDepartamentoAsync();
        cargarComboSuperficieAsync();
    }
    
        
    //Debo hacer un cambio profundo para agregar los valores por defecto a los comboWorkers
    //podria remover la dependencia a Lotes, pero no voy a hacerlo
    //
    
    public LotesVisualPanel1(Lotes lote) {
        initComponents();
//        actual = lote;
//        Setear los campos
        String superficie = "0";
        try {
            superficie = il.fundamentalAsuperficie(lote.getSuperficie(),lote.getUnidadMedidaSuperficie().getFactorMultiplicacion()).toString();
        }
        catch(Exception ignore) {}
        CampoNombre.setText(lote.getNombre());
        CampoSuperficie.setText(superficie);
        CampoCompania.setText(lote.getCompania());
        CheckEsPropio.setSelected(lote.getEsPropio() == 0? false:true);
//        CampoComentarios.setText(actual.getComentarios);
//        fin
//        Enviar el parametro por defecto
        cargarComboDepartamentoAsync(lote.getDistrito().getDepartamento());
//        Enviar el parametro por defecto
        if (!ComboDistrito.isEnabled())
            ComboDistrito.setEnabled(true);
        cargarComboDistritoAsync(lote.getDistrito().getDepartamento(),lote.getDistrito());
        //Enviar parametros por defecto
        cargarComboSuperficieAsync(lote.getUnidadMedidaSuperficie());
        //setear Listeners
        setListener();
        
    }
    
    /**
     * Setear Listener
     * @return 
     */
    private void setListener() {
        CheckEsPropio.addChangeListener(new ChangeListener() {

            @Override
            public void stateChanged(ChangeEvent e) {
               if (e.getSource().equals(CheckEsPropio)) 
                    firePropertyChange(PROPIEDAD_ES_PROPIO, 0,(Boolean)CheckEsPropio.isSelected());
            }
        });
        CampoNombre.getDocument().addDocumentListener(this);
        CampoSuperficie.getDocument().addDocumentListener(this);       
        CampoCompania.getDocument().addDocumentListener(this);       
        //Cargar los datos en los combos, al combo de departamentos lo hago cargar en background
        ComboDepartamento.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
//              Controlar que los datos hayan sidos seleccionados no Deseleccionados
                if (e.getStateChange() == ItemEvent.SELECTED)
                    cargarComboDistritoAsync(e.getItem());
            }
        });
        //Setear listener para combo Distrito
        ComboDistrito.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED)
                    firePropertyChange(PROPIEDAD_DISTRITO, 0, e.getItem());
            }
        });
        
        ComboSuperficie.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    firePropertyChange(PROPIEDAD_UNIDAD_MEDIDA, 0, e.getItem());
                }
            }
        });
        
        
    }

    @Override
    public String getName() {
        return "Paso #1";
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        ComboDepartamento = new javax.swing.JComboBox<Departamento>();
        ComboDistrito = new javax.swing.JComboBox<Distrito>();
        CampoCompania = new javax.swing.JTextField();
        CampoSuperficie = new javax.swing.JTextField();
        ComboSuperficie = new javax.swing.JComboBox<UnidadMedidaSuperficie>();
        CampoNombre = new javax.swing.JTextField();
        jScrollPane1 = new javax.swing.JScrollPane();
        CampoComentarios = new javax.swing.JTextArea();
        CheckEsPropio = new javax.swing.JCheckBox();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();

        ComboDepartamento.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));

        ComboDistrito.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        ComboDistrito.setEnabled(false);

        CampoCompania.setText(org.openide.util.NbBundle.getMessage(LotesVisualPanel1.class, "LotesVisualPanel1.CampoCompania.text")); // NOI18N

        CampoSuperficie.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        CampoSuperficie.setText(org.openide.util.NbBundle.getMessage(LotesVisualPanel1.class, "LotesVisualPanel1.CampoSuperficie.text")); // NOI18N

        ComboSuperficie.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));

        CampoNombre.setText(org.openide.util.NbBundle.getMessage(LotesVisualPanel1.class, "LotesVisualPanel1.CampoNombre.text")); // NOI18N

        CampoComentarios.setColumns(20);
        CampoComentarios.setRows(5);
        jScrollPane1.setViewportView(CampoComentarios);

        org.openide.awt.Mnemonics.setLocalizedText(CheckEsPropio, org.openide.util.NbBundle.getMessage(LotesVisualPanel1.class, "LotesVisualPanel1.CheckEsPropio.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(LotesVisualPanel1.class, "LotesVisualPanel1.jLabel1.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(LotesVisualPanel1.class, "LotesVisualPanel1.jLabel2.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(LotesVisualPanel1.class, "LotesVisualPanel1.jLabel3.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(LotesVisualPanel1.class, "LotesVisualPanel1.jLabel4.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jLabel5, org.openide.util.NbBundle.getMessage(LotesVisualPanel1.class, "LotesVisualPanel1.jLabel5.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jLabel6, org.openide.util.NbBundle.getMessage(LotesVisualPanel1.class, "LotesVisualPanel1.jLabel6.text")); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel1)
                    .addComponent(jLabel2)
                    .addComponent(jLabel3)
                    .addComponent(jLabel4)
                    .addComponent(jLabel5)
                    .addComponent(jLabel6))
                .addGap(28, 28, 28)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(CampoNombre)
                    .addComponent(ComboDepartamento, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 208, Short.MAX_VALUE)
                    .addComponent(CampoCompania)
                    .addComponent(ComboDistrito, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(CampoSuperficie)
                            .addComponent(CheckEsPropio, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addGap(18, 18, 18)
                        .addComponent(ComboSuperficie, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap(86, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel1)
                    .addComponent(ComboDepartamento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(ComboDistrito, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel2))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(CampoNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel3))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(CampoCompania, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel4))
                .addGap(12, 12, 12)
                .addComponent(CheckEsPropio)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(CampoSuperficie, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel5)
                    .addComponent(ComboSuperficie, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(19, 19, 19)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel6))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
    }// </editor-fold>//GEN-END:initComponents
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTextArea CampoComentarios;
    private javax.swing.JTextField CampoCompania;
    private javax.swing.JTextField CampoNombre;
    private javax.swing.JTextField CampoSuperficie;
    private javax.swing.JCheckBox CheckEsPropio;
    private javax.swing.JComboBox<Departamento> ComboDepartamento;
    private javax.swing.JComboBox<Distrito> ComboDistrito;
    private javax.swing.JComboBox<UnidadMedidaSuperficie> ComboSuperficie;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JScrollPane jScrollPane1;
    // End of variables declaration//GEN-END:variables
    
    /**
     * Metodo para cargar los datos en un combo, le paso el nuevo item y realiza la busqueda en la base de datos
     * cargando los resultados en el combo
     * @param object 
     */
    private void cargarComboDistritoAsync(Object object){
//        Crear un swing.Worker que traiga los datos y los setee al combo, cuando carga todo el combo que lo habilite
        
        final Departamento departamento = (Departamento) object;
        javax.swing.SwingWorker<DefaultComboBoxModel, Departamento> worker = new javax.swing.SwingWorker<DefaultComboBoxModel, Departamento>() {
            DefaultComboBoxModel dcbm ;
            @Override
            protected DefaultComboBoxModel doInBackground() throws Exception {
                ILotes il = Lookup.getDefault().lookup(ILotes.class);
                List<Distrito> distritosList = il.getDistritos(departamento);
                if(ComboDistrito.isEnabled())
                    ComboDistrito.setEnabled(false);
                dcbm = new DefaultComboBoxModel(distritosList.toArray());
                return dcbm;
                
            }

            @Override
            protected void done() {
                //La execucion termino, cargar los datos
                ComboDistrito.setModel(dcbm);
                ComboDistrito.setEnabled(true);
                
            }     
        };
       worker.execute();
    }
    
    /**
     * Metodo para cargar los datos en el combo Distritp
     */
    
     private void cargarComboDistritoAsync(final Departamento dpto, Distrito dist){
         ComboEnBackground<Distrito> worker = new ComboEnBackground<Distrito>(ComboDistrito, Boolean.FALSE, dist) {

            @Override
            public List<Distrito> getDatos() {
                try {
                    return il.getDistritos(dpto);
                }
                catch (Exception mostrar) {
                    
                }
                return null;
            }
        };
        worker.execute(); 
     }
    
    /**
     * Metodo para cargar datos en el combo Departamento
     */  
    private void cargarComboDepartamentoAsync(){
       //Llamar a la interface para pedir datos, iterar los datos y meterlos al combo
        //Creo que voy a crear mi propio comboBox, para poder agregar las opciones necesarias
       javax.swing.SwingWorker<DefaultComboBoxModel,Object> worker = new javax.swing.SwingWorker<DefaultComboBoxModel,Object>() {
            DefaultComboBoxModel dcbm; 
            @Override
            protected DefaultComboBoxModel doInBackground() throws Exception {
                if (ComboDepartamento.isEnabled())
                    ComboDepartamento.setEnabled(false);
                List<Departamento> dl =  il.getDepartamentos();
                dcbm = new DefaultComboBoxModel(dl.toArray());
                return dcbm;  
            }

            @Override
            protected void done() {
//                La execucion termino, cargar los datos
//                dcbm
                ComboDepartamento.setModel(dcbm);
                ComboDepartamento.setEnabled(true);
                //Se le llama al metodo para cargar los datos de forma asyncrona
                cargarComboDistritoAsync(ComboDepartamento.getSelectedItem());
            }
       };
       worker.execute();
    }
    
    
    /**
     * Metodo 
     */
    private void cargarComboDepartamentoAsync(final Departamento dpto){
        ComboEnBackground<Departamento> worker = new ComboEnBackground<Departamento>(ComboDepartamento, Boolean.FALSE, dpto) {

            @Override
            public List<Departamento> getDatos() {
                try {
                    return il.getDepartamentos();
                }
                catch (Exception e){}
                return null;
            }
        };
        worker.execute();
    }    
    /**
     * Metodo para cargar los datos en el ComboSuperficie
     * Se realiza a traves de un worker, en background
     */
    private void cargarComboSuperficieAsync(){
       //Llamar a la interface para pedir datos, iterar los datos y meterlos al combo
       javax.swing.SwingWorker<DefaultComboBoxModel, Object> worker = new javax.swing.SwingWorker<DefaultComboBoxModel, Object>() {
            DefaultComboBoxModel dcbm;
            @Override
            protected DefaultComboBoxModel doInBackground() throws Exception {
                ILotes il = Lookup.getDefault().lookup(ILotes.class);
                List<UnidadMedidaSuperficie> usl =  il.getUnidadesSuperficies();
                dcbm = new DefaultComboBoxModel(usl.toArray());
                return dcbm;  
            }

            @Override
            protected void done() {
                //La execucion termino, cargar los datos
                ComboSuperficie.setModel(dcbm); 
            }
        };
       worker.execute(); 
        
    }
    
    /**
     * Metodo para cargar los datos en el comboSuperficie
     */
    private void cargarComboSuperficieAsync(UnidadMedidaSuperficie ums){
        ComboEnBackground<UnidadMedidaSuperficie> ceb = new ComboEnBackground<UnidadMedidaSuperficie>(ComboSuperficie, Boolean.FALSE, ums) {

            @Override
            public List<UnidadMedidaSuperficie> getDatos() {
                try{
                    return il.getUnidadesSuperficies();
                }
                catch (Exception e) {
                    System.err.println(e.getStackTrace());
                    return null;
                }
            }
        };
        ceb.execute();
    }
    /**
     * 
     */
//    public modelo.Lotes getLote(){
//       componentToPojo(); 
//       return actual;
//    }
    
    
//    private void componentToPojo(){
////        Cargando los datos
////        Se deben validar los datos antes de llamar a este metodo
//                
//        actual.setNombre(CampoNombre.getText());
//        actual.setCompania(CampoCompania.getText());
//        
//        //Para los bigDecimal es un  embole
//        try {
//            BigDecimal superficie =  new BigDecimal(CampoSuperficie.getText());
//            actual.setSuperficie(superficie);
//        }
//        catch (NumberFormatException nfe) {}
//        actual.setEsPropio(true == CheckEsPropio.isSelected() ? 1:0);
//        //Seteando los combos
//        actual.setDistrito((modelo.Distrito)ComboDistrito.getSelectedItem());
//        actual.setUnidadMedidaSuperficie((modelo.UnidadMedidaSuperficie)ComboSuperficie.getSelectedItem());
//    }

    @Override
    public void insertUpdate(DocumentEvent e) {
        dispararEventos(e);
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        dispararEventos(e);   
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        dispararEventos(e);
    }
    
    public JTextField getNombre() {
        return CampoNombre;
    }
    public JTextField getSuperficie() {
        return CampoSuperficie;
    }
    
    private void dispararEventos(DocumentEvent e){
        if (CampoNombre.getDocument() == e.getDocument()){
            firePropertyChange(PROPIEDAD_NOMBRE, 0, 1);
        }
        if (CampoSuperficie.getDocument() == e.getDocument()){
            firePropertyChange(PROPIEDAD_SUPERFICIE, 0, 1);
        }
        if (CampoCompania.getDocument() == e.getDocument()){
            firePropertyChange(PROPIEDAD_COMPANIA, 0, 1);
        }
    }
    
    /**
     * 
     * @return 
     */
    public Distrito getDistrito() {
        return (Distrito) ComboDistrito.getSelectedItem();
    }
    
    /**
     * 
     * @return 
     */
    public UnidadMedidaSuperficie getUnidadSuperficie(){
        return (UnidadMedidaSuperficie) ComboSuperficie.getSelectedItem();
    }
    /**
     * 
     * @return 
     */
    public Integer getEsPropio() {
       return CheckEsPropio.isSelected() ? 1:0;
    }
    /**
     * 
     * @return 
     */
    public String getCompania () {
       return CampoCompania.getText();
    }
        
    
    
}
